/*
    测试用于处理json数据格式的c++库（第三方库，编译的时候要指名连接的库）
*/
#include <iostream>
#include <string>
#include <fstream>
#include <jsoncpp/json/json.h>

class Cal
{
public:
    Cal(int x = 0, int y = 0, char oper = '+') : _x(x), _y(y), _oper(oper)
    {
    }

    void debug()
    {
        std::cout << _x << " " << (char)_oper << " " << _y << std::endl;
    }

    int _x;
    int _y;
    char _oper;
};

void func1()
{
    Cal c(1, 1, '+');
    // 1、定义一个json对象
    Json::Value value;
    value["x"] = c._x;
    value["y"] = c._y;
    value["oper"] = c._oper;
    //value["value"] = value; //json格式也可以是自己

    // 2、将json对象序列化成字符串
    // 两种不同的序列化方式
    // 第一种
    Json::FastWriter writer;
    std::string str = writer.write(value);
    std::cout << str << std::endl; //{"oper":43,"value":{"oper":43,"x":1,"y":1},"x":1,"y":1}
    // //第二种
    // Json::StyledWriter writer;
    // std::string str = writer.write(value);
    // std::cout << str << std::endl;
    // // {
    // //     "oper" : 43,
    // //     "value" : {
    // //         "oper" : 43,
    // //         "x" : 1,
    // //         "y" : 1
    // //     },
    // //     "x" : 1,
    // //     "y" : 1
    // // }

    // 3、写入到文件中
    std::ofstream out("json.txt");
    out << str;
    out.close();
}

void func2()
{
    // 4、读取文件中的json格式的数据到字符串
    char buf[1024] = {0};
    std::ifstream in("json.txt");
    in.read(buf, sizeof(buf));
    std::string tmp(buf);

    // 5、反序列化
    Json::Value value;
    Json::Reader reader;
    reader.parse(tmp, value);
    std::cout << "tmp:" << tmp << std::endl;

    // 6、将json数据转换成Cal
    Cal c; //下面转换先后顺序无关
    c._x = value["x"].asInt();
    c._y = value["y"].asInt();
    c._oper = std::stoi(value["oper"].asString());
    c.debug();
}

int main()
{
    // 将自定义类转换json数据、将json数据序列化成字符串
    //func1();

    // 将字符串反序列化成json数据，将json数据还原成Cal类
    func2();

    return 0;
}
